package com.area.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.List;


/**
 * 集合转树装结构
 * <dependency>
 *      <groupId>com.alibaba</groupId>
 *      <artifactId>fastjson</artifactId>
 *      <version>1.2.83</version>
 * </dependency>
 * @author WangPeiXi
 * @date 2022/7/4 9:15
 * @version V1.0.0
 */
public class TreeUtil {

    /**
     * 将指定的list转换成为树结构的数据
     * 示例 TreeUtil.parseTree(list,"id","parentId","children","0")
     * @param list     集合对象，每个对象都有用来表示上下级关系的属性结构
     * @param id       集合中用来表示id列
     * @param parentId 集合对象中用来表示parentId的列
     * @param children   父子级关系表现出来时，将会在父级节点内添加本属性数组集合，并将自己点放置到本数组集合内
     * @param parentIdValue 最顶级的id值
     * @return 树结构的 JSONArray 对象
     */
    public static JSONArray parseTree(List<?> list, String id, String parentId, String children, Object parentIdValue) {
        JSONArray obj = new JSONArray();
        if(null == list || list.isEmpty() ){
            return obj;
        }
        for (Object object : list) {
            JSONObject tmepOjb = JSONObject.parseObject(JSON.toJSONString(object));
            Object menuId = tmepOjb.get(id);
            Object pid = tmepOjb.get(parentId);
            if (null != pid && parentIdValue.toString().equals(pid.toString())) {
                JSONArray c_node = parseTree(list, id, parentId, children, menuId);
                tmepOjb.put(children, c_node);
                obj.add(tmepOjb);
            }
        }
        return obj;
    }
    /**
     * 将指定的list转换成为树结构的数据
     * 示例 TreeUtil.parseTree(list,"id","parentId","children","0",XXX.class)
     * @param list     集合对象，每个对象都有用来表示上下级关系的属性结构
     * @param id       集合中用来表示id列
     * @param parentId 集合对象中用来表示parentId的列
     * @param children   父子级关系表现出来时，将会在父级节点内添加本属性数组集合，并将自己点放置到本数组集合内
     * @param parentIdValue 最顶级的id值
     * @param clazz 转换的对象实体
     * @return 树结构的 JSONArray 对象
     */
    public static <T> List<T> parseTree(List<?> list, String id, String parentId, String children, Object parentIdValue, Class<T> clazz) {
        JSONArray objects = parseTree(list, id, parentId, children, parentIdValue);
        return objects.toJavaList(clazz);
    }
}
